package reflect;
/*反射的第一步，获取要操作的类的类对象
java.lang.Class 类对象
它的每一个实例用于表示一个被JVM加载的类。
意味着JVM每加载一个类(读取对应类的.class文件)的同时会实例化
一个Class实例与之绑定，并在该Class实例上记录加载的类的一切信息
因此每个被加载的类都有且只有一个Class的实例与之对应，通过这个
        类对象就可以了解其表示的类的所有信息

获取一个类对象的方式
            1.通过类名.class
Class cls = String.class;//获取String的类对象
Class cls2 = int.class;//基本类型也可以获取类对象

            2.Class.forName(String className)
Class cls3 = Class.forName("java.lang.String");

            3.类加载器ClassLoader
            4.对象.getClass()*/

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Scanner;

import static java.lang.Class.forName;

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        //获取String的类对象
        //Class cls = String.class ;
        //Class cls = ArrayList.class;

        //通过指定类的完全限定名获取一个类的类对象
        //        Class cls = forName("java.lang.String");
        //        Class cls2 = Class.forName("java.util.ArrayList");
        //通过类名获取类对象
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入类名");
        String className = scanner.next();
        Class cls = Class.forName(className);


        //获取类对象表示的类的完全限定名
//        String className = cls.getName();
//        System.out.println(className);
        //仅获取类名
        className = cls.getSimpleName();
        System.out.println(className);
        /*
        Class的每一个实例用于表示一个类
        Package是反射对象之一，它的每一个实例仅表示一个包
        */
        Package pack = cls.getPackage();
        String packName = pack.getName();
        System.out.println("包名" + packName);

        /*
        Method类，反射对象之一，它的每一个实例用于表示一个方法
        */
        Method[] methods = cls.getMethods();
        System.out.println("一共" + methods.length + "个方法");
        for (Method m : methods) {
            System.out.println(m.getName());
        }

    }
}
